#![allow(unused)]


use std::io::{self, Write};
use std::{collections::*, env, fs, process};
use std::error::Error;

fn root_func() {
    
}

pub mod demo;
// Rust会从与模块同名的文件中加载内容
mod front_of_house;

pub use crate::front_of_house::hosting;
use front_of_house::Car;
use std::fmt;
use std::io::Result as IOResult;

pub fn eat_at_resta() {
    /* 路径(Path):
    - 为了在Rust 的模块中找到某个条目，需要使用路径。
    - 路径的两种形式:
        - 绝对路径:从crate root开始，使用crate名或字面值 crate
        - 相对路径:从当前模块开始，使用self，super或当前模块的标识符
    - 路径至少由一个标识符组成，标识符之间使用 ::
     */
    crate::front_of_house::hosting::add_to_waitlist();
    front_of_house::hosting::add_to_waitlist();

    /* 私有边界(privacy boundary)
    - 模块不仅可以组织代码，还可以定义私有边界。
    - 如果想把函数或struct等设为私有，可以将它放到某个模块中。
    - Rust中所有的条目(函数，方法，struct，enum，模块，常量)默认是私有的。
    - 父级模块无法访问子模块中的私有条目
    - 子模块里可以使用所有祖先模块中的条目
     */
    // front_of_house::hosting::seat_at_table();

    /*
     super 关键字
     用来访问父级模块路径中的内容，类似文件系统中的 “..”
     */
    
    /* pub struct
    - pub 放在 struct 前:
        - struct是公共的
        - struct 的字段默认是私有的
    - struct 的字段需要单独设置pub 来变成共有。
     */
    let mut car = front_of_house::Car::new(String::from("布佳迪"), 1999.9999);
    println!("car name = {}", car.name);
    car.name = String::from("bujjadi");
    // car.price = 100;
    println!("car name = {}", car.name);

    /* pub enum
    - pub 放在 enum 前:
        - enum 是公共的
        - enum 的变体也都是公共的
     */
    let yes = front_of_house::Decision::OK;

    /* use 关键字
    - 可以使用 use关键字将路径导入到作用域内
        - 仍遵循私有性规则
    - 使用 use 来指定相对路径
     */
    hosting::add_to_waitlist();
    let c = Car::new(String::from("fa"), 199.99);

    /* use 的习惯用法
    - 函数: 将函数的父级模块引入作用域(指定到父级)
    - struct，enum，其它:指定完整路径(指定到本身)
    - 同名条目: 指定到父级
     */
    // fmt::Result();
    // io::Result();
    // as 为 use 指定别名
    // IOResult();

    /* 使用 pub use 重新导出名称
    - 使用 use将路径(名称)导入到作用域内后，该名称在此作用域内是私有的。
    - pub use: 重导出
        - 将条目引入作用域
        - 该条目可以被外部代码引入到它们的作用域
     */
    hosting::add_to_waitlist();
    

    /* 使用外部包(package)
    1. Cargo.toml添加依赖的包(package)
        - https://crates.io/
    2. use 将特定条目引入作用域
     */

    /* 标准库(std)也被当做外部包
    - 不需要修改Cargo.toml来包含std
    - 需要使用use将std中的特定条目引入当前作用域
     */

    /* 使用嵌套路径清理大量的 use 语句
    - 如果使用同一个包或模块下的多个条目(例子)
    - 可使用嵌套路径在同一行内将上述条目进行引入:
        - 路径相同的部分::{路径差异的部分}

    - 如果两个use路径之一是另一个的子路径
        - 使用 self: `use std::io::{self, Write}; `
        - 
     */

    /* 通配符*
    - 使用*可以把路径中所有的公共条目都引入到作用域。
    - 注意:谨慎使用
    - 应用场景:
        - 测试。将所有被测试代码引入到tests 模块
        - 有时被用于预导入(prelude)模块
        - `use std::collections::*;`
     */

    /* 将模块内容移动到其它文件
    - 模块定义时，如果模块名后边是“;”，而不是代码块:
        - Rust会从与模块同名的文件中加载内容
        - 模块树的结构不会变化
    - 随着模块逐渐变大，该技术让你可以把模块的内容移动到其它文件中
     */
}
